﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Threading;
//using ET.CommonLibrary.Log;
using log4net;
using log4net.Config;
using System.Xml.Linq;
//using ET.CommonLibrary.Localization;
using System.Globalization;
using System.Text;
using System.Diagnostics;

namespace ET.ScoreTeacherClient
{
    /// <summary>
    /// App.xaml 的交互逻辑
    /// </summary>
    public partial class App : Application
    {
        //只允许一个进程 Add by gy
        System.Threading.Mutex mutex;

        public App()
        {
            this.Startup += new StartupEventHandler(App_Startup);
        }

        void App_Startup(object sender, StartupEventArgs e)
        {

            Process proceMain = Process.GetCurrentProcess();
            Process[] processes = Process.GetProcesses();
            foreach (Process process in processes)//获取所有同名进程id
            {
                if (process.ProcessName == "ET.ScoreTeacherClient")
                {
                    if (process.Id != proceMain.Id)//根据进程id删除所有除本进程外的所有相同进程
                    {
                        var dialog = System.Windows.MessageBox.Show("检测到同名进程是否删除该进程", "提示", MessageBoxButton.YesNo);
                        if (dialog == MessageBoxResult.Yes)
                        {
                            process.Kill();
                        }
                        else
                        {
                            return;
                        }

                    }

                }
            }

        }
        protected override void OnStartup(StartupEventArgs e)
        {

            base.OnStartup(e);

            InitializeLogger();

            //InitializeLocalization();
            Application.Current.DispatcherUnhandledException += new DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException);

            //Task线程内未捕获异常处理事件
            TaskScheduler.UnobservedTaskException += TaskScheduler_UnobservedTaskException;

            //非UI线程未捕获异常处理事件
            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
        }

        void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
        {
            try
            {
                e.Handled = true; //把 Handled 属性设为true，表示此异常已处理，程序可以继续运行，不会强制退出      
                MessageBox.Show("捕获未处理异常:" + e.Exception.Message + "\r\n" + e.Exception.StackTrace);
               // EnvironmentContext.Logger.Error(e.Exception.ToString());
            }
            catch (Exception ex)
            {
                //此时程序出现严重异常，将强制结束退出
                MessageBox.Show("程序发生致命错误，将终止，请联系运营商！");
                //EnvironmentContext.Logger.Error(ex.ToString());
            }
        }

        void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
        {
            StringBuilder sbEx = new StringBuilder();
            if (e.IsTerminating)
            {
                sbEx.Append("程序发生致命错误，将终止，请联系运营商！\n");
            }
            sbEx.Append("捕获未处理异常：");
            if (e.ExceptionObject is Exception)
            {
                sbEx.Append(((Exception)e.ExceptionObject).Message);
            }
            else
            {
                sbEx.Append(e.ExceptionObject);
            }
            MessageBox.Show(sbEx.ToString());
            //EnvironmentContext.Logger.Error(sbEx.ToString());
        }

        void TaskScheduler_UnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs e)
        {
            //task线程内未处理捕获
            //MessageBox.Show("捕获线程内未处理异常：" + e.Exception.ToString());
          //  EnvironmentContext.Logger.Error(e.Exception.ToString());
            e.SetObserved();//设置该异常已察觉（这样处理后就不会引起程序崩溃）
        }

        private void InitializeLogger()
        {
            XmlConfigurator.Configure(File.OpenRead(@"Config\log4net.config"));
            var loginfo = LogManager.GetLogger("loginfo");
            var logerror = LogManager.GetLogger("logerror");
            // 设置全局日志器
           // EnvironmentContext.SetLogger(new Log4NetLogger(loginfo, loginfo, loginfo, logerror, logerror));
        }

        //private void InitializeLocalization()
        //{
        //    //  CultureInfo.DefaultThreadCurrentUICulture = CultureInfo.GetCultureInfo("en-US");
        //    /* 加载本地化数据文件创建字典并加入到字典管理器中。
        //    * 
        //    * 在项目中，应该在"解决方案资源管理器"中设置文件的属性：
        //    *      "复制到生成目录" 设置为 "始终复制"
        //    *      "生成操作" 设置为 "无"
        //    */
        //    // 本地化数据文件文件路径
        //    string localizationFilePath = @"Localizations\Localizations.xls";
        //    // columnSelector 参数为null,表示使用默认的列选择器,实际场景中可以使用不同的实现。
        //    var dictionaryFactory = new ExcelLocalizationDictionaryFactory(localizationFilePath, null);
        //    ILocalizationDictionary chinese = dictionaryFactory.CreateLocalizationDictionary("zh-CN");
        //    ILocalizationDictionary english = dictionaryFactory.CreateLocalizationDictionary("en-US");

        //    var mngr = new LocalizationDictionaryManager();
        //    mngr.Add(chinese);
        //    mngr.Add(english);

        //    // 设置LocalizationUtility使用的字典管理器，此静态工具类通常在代码中使用
        //    LocalizationUtility.SetLocalizationDictionaryManager(mngr);

        //    // 设置本地化wpf扩展标记使用的字典管理器，此设置仅作用于wpf界面，通常和上面的保持一致。
        //    ET.CommonLibrary.Wpf.LocalizationExtension
        //        .LocalizationExtension
        //        .SetLocalizationDictionaryManager(mngr);
        //}
    }
}
